//
//  Date.swift
//  Documentation
//
//  Created by Toj on 11/9/23.
//

/**
 * 总结:
 * Date 类型是UTC 时间
 * date.to_string UTC -> 本地时间
 * dateString.to_date 本地时间 -> UTC时间
 * 如果服务器返回的是UTC 时间, 必须加上Z的信息 Z == +0000
 * 如果没有返回Z则认为是当前时区的时间, Date 会转换到UTC时间
 * e.g.:
 * "2023-11-09T07:22:13.000+0000"  -> Date
 * +0000代表UTC时间,  date: 2023-11-09 07:22:13.000+0000
 * -0800代表西8区时间, date: 2023-11-09 15:22:13.000+0000
 * +0800代表东8区时间, date: 2023-11-08 23:22:13.000+0000
 */

public struct Date : ReferenceConvertible, Comparable, Equatable, Sendable {

    public typealias ReferenceType = NSDate

    /// 1970到2001年的间隔(秒)
    public static let timeIntervalBetween1970AndReferenceDate: Double

    /// 2001-1-1 00:00:00到现在的间隔(秒)
    public static var timeIntervalSinceReferenceDate: TimeInterval { get }
    
    /// 当前UTC时间 
    public init()

    /// 相对当前日期偏移多少秒后的日期
    public init(timeIntervalSinceNow: TimeInterval)

    /// 相对1970-01-01 00:00:00年偏移多少秒后的日期
    public init(timeIntervalSince1970: TimeInterval)

    /// 相对指定日期偏移多少秒后的日期
    public init(timeInterval: TimeInterval, since date: Date)

    /// 相对2001-01-01 00:00:00偏移多少秒后的日期
    public init(timeIntervalSinceReferenceDate ti: TimeInterval)

    
    /// 2001-1-1 00:00:00到self的间隔(秒)
    public var timeIntervalSinceReferenceDate: TimeInterval { get }

    /// self与时间date的间隔(秒)
    public func timeIntervalSince(_ date: Date) -> TimeInterval

    /// self与当前时间的间隔(秒)
    public var timeIntervalSinceNow: TimeInterval { get }

    /// self与1970-01-01 00:00:00年的间隔(秒)
    public var timeIntervalSince1970: TimeInterval { get }

    /// 增加时间(秒), 负数就是减少
    public func addingTimeInterval(_ timeInterval: TimeInterval) -> Date
    /// 累加时间(秒), 负数就是递减
    public mutating func addTimeInterval(_ timeInterval: TimeInterval)

    // 一个遥远的将来的日期
    public static let distantFuture: Date
    
    // 一个遥远的过去的日期
    public static let distantPast: Date

    /// 当前日期
    @available(macOS 12, iOS 15, tvOS 15, watchOS 8, *)
    public static var now: Date { get }

    public func hash(into hasher: inout Hasher)

    /// 比较日期
    public func compare(_ other: Date) -> ComparisonResult
    public static func == (lhs: Date, rhs: Date) -> Bool
    public static func < (lhs: Date, rhs: Date) -> Bool
    public static func > (lhs: Date, rhs: Date) -> Bool
    /// 增加时间(秒)
    public static func + (lhs: Date, rhs: TimeInterval) -> Date
    /// 减少时间(秒)
    public static func - (lhs: Date, rhs: TimeInterval) -> Date
    
    /// 累加时间(秒)
    public static func += (lhs: inout Date, rhs: TimeInterval)
    /// 递减时间(秒)
    public static func -= (lhs: inout Date, rhs: TimeInterval)

    /// hashcode
    public var hashValue: Int { get }
}
